package cn.jbolt.util;

import cn.hutool.core.io.FileUtil;
import cn.jbolt.ai.common.entity.LocalConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.PostConstruct;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

@Component
public class UploadLocalUtil {

    @Autowired
    private LocalConfig localConfig;

    //域名
    private static String DOMAIN;
    //根路径文件
    private static String ROOTDIR;



    @PostConstruct
    public void init() {

        DOMAIN = localConfig.getDomain();
        ROOTDIR = localConfig.getRootDir();
    }


    private static final Logger logger = LoggerFactory.getLogger(UploadLocalUtil.class);



    /**
     * 上传 MultipartFile 到本地
     *
     * @param sourceFile 源文件
     * @param filePath   文件路径
     * @return 上传结果
     */
    public static Result<String> uploadFileToLocal(MultipartFile sourceFile, String filePath) {


        try {
            // 获取项目根目录下的upload文件夹路径
            String uploadDir = System.getProperty("user.dir") + ROOTDIR;
            File uploadDirectory = new File(uploadDir);
            if (!uploadDirectory.exists()) {
                uploadDirectory.mkdirs();
            }

            // 拼接完整的文件路径
            // 判断,如果不是/开头加上/
            if (!filePath.startsWith("/")) {
                filePath = "/" + filePath;
            }
            String fullPath = uploadDir + filePath;

            // 使用Hutool的FileUtil.touch方法创建文件
            // 该方法会自动创建所需的父文件夹
            File targetFile = FileUtil.touch(fullPath);

            if (targetFile.exists()) {
                logger.info("文件已存在：" + targetFile.getAbsolutePath());
            } else {
                logger.info("文件创建成功：" + fullPath);
            }
            // 将 MultipartFile 内容复制到目标文件
            sourceFile.transferTo(targetFile);
            String url = DOMAIN + filePath;
            return Result.success(url);
        } catch (IOException e) {
            e.printStackTrace();
            logger.error("文件上传失败：" + e.getMessage());
            throw new RuntimeException(e);

        }
    }

    /**
     * 上传 InputStream 到本地
     *
     * @param inputStream 输入流
     * @param filePath    文件路径
     * @return 上传结果
     */
    public static Result<String> uploadInputStreamToLocal(InputStream inputStream, String filePath) {

        try {
            // 获取项目根目录下的upload文件夹路径
            String uploadDir = System.getProperty("user.dir") + ROOTDIR;
            File uploadDirectory = new File(uploadDir);
            if (!uploadDirectory.exists()) {
                uploadDirectory.mkdirs();
            }

            // 拼接完整的文件路径
            // 判断,如果不是/开头加上/
            if (!filePath.startsWith("/")) {
                filePath = "/" + filePath;
            }
            String fullPath = uploadDir + filePath;

            // 使用Hutool的FileUtil.touch方法创建文件
            // 该方法会自动创建所需的父文件夹
            File targetFile = FileUtil.touch(fullPath);

            if (targetFile.exists()) {
                logger.info("文件已存在：" + targetFile.getAbsolutePath());
            } else {
                logger.info("文件创建成功：" + fullPath);
            }

            // 将输入流内容复制到目标文件
            FileUtil.writeFromStream(inputStream, targetFile);
            String url = DOMAIN + filePath;
            return Result.success(url);
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
